Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


tests/identity.py HEAD (4fc8e03d) Text, 12.44 KB

Tff7b72import T7ee787unittest

Tff7b72import T7ee787time
Tff7b72import T7ee787RNS
Tff7b72import T7ee787os

Te6edf3signed_message Tff7b72= Ta5d6ff"Ta5d6ffe51a008b8b8ba855993d8892a40daad84a6fb69a7138e1b5f69b427fe03449826ab6ccb81f0d72b4725e8d55c814d3e8e151b495cf5b59702f197ec366d935ad04a98ca519d6964f96ea09910b020351d1cdff3befbad323a2a28a6ec7ced4d0d67f02c525f93b321d9b076d704408475bd2d123cd51916f7e49039246ac56add37ef87e32d7f9853ac44a7f77d26fedc83e4e67a45742b751c2599309f5eda6efa0dafd957f61af1f0e86c4d6c5052e0e5fa577db99846f2b7a0204c31cef4013ca51cb307506c9209fd18d0195a7c9ae628af1a1d9ee7a4cf30037ed190a9fdcaa4ce5bb7bea19803cb5b5cea8c21fdb98d8f73ff5aaad87f5f6c3b7bcfe8974e5b063cc1113d77b9e96bec1c9d10ed37b780c3f7349a34092bb3968daeced40eb0b5130c0d11595e30b9671896385d04289d067f671599386536eed8430a72e186fb95023d5ac5dd442443bfabfe13a84a38d060af73bf20f921f38a768672fdbcb1dfece7458166e2e15948d6b4fa81f42db48747d283c670f576a0b410b31a70d2594823d0e29135a488cb0408c9e5bc1e197ff99aef471924231ccc8e3eddc82dbcea4801f14c5fc7a389a26a52cc93cfe0770953ef595ff410b7033a6ed5c975dd922b3f48f9dffcfb412eeed5758f3aa51de7eb47cd2cbTa5d6ff"
Te6edf3sig_from_key_0 Tff7b72= Ta5d6ff"Ta5d6ff3020ef58f861591826a61c3d2d4a25b949cdb3094085ba6b1177a6f2a05f3cdd24d1095d6fdd078f0b2826e80b261c93c1ff97fbfd4857f25706d57dd073590cTa5d6ff"

Te6edf3encrypted_message Tff7b72= Ta5d6ff"Ta5d6ff71884a271ead43558fcf1e331c5aebcd43498f16da16f8056b0893ce6b15d521eaa4f31639cd34da1b57995944076c4f14f300f2d2612111d21a3429a9966ac1da68545c00c7887d8b26f6c1ab9defa020b9519849ca41b7904199882802b6542771df85144a79890289d3c02daef6c26652c5ce9de231a2Ta5d6ff"
Te6edf3fixed_token Tff7b72= Ta5d6ff"Ta5d6ffe37705f9b432d3711acf028678b0b9d37fdf7e00a3b47c95251aad61447df2620b5b9978783c3d9f2fb762e68c8b57c554928fb70dd79c1033ce5865f91761aad3e992790f63456092cb69b7b045f539147f7ba10d480e300f193576ae2d75a7884809b76bd17e05a735383305c0aa5621395bbf51e8cc66c1c536f339f2bea600f08f8f9a76564b2522cd904b6c2b6e553ec3d4df718ae70434c734297b313539338d184d2c64a9c4ddbc9b9a4947d0b45f5a274f65ae9f6bb203562fd5cede6abd3c615b699156e08fa33b841647a0Ta5d6ff"

Te6edf3fixed_keys Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6fff8953ffaf607627e615603ff1530c82c434cf87c07179dd7689ea776f30b964cfb7ba6164af00c5111a45e69e57d885e1285f8dbfe3a21e95ae17cf676b0f8b7Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff650b5d76b6bec0390d1f8cfca5bd33f9Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffd85d036245436a3c33d3228affae06721f8203bc364ee0ee7556368ac62add650ebf8f926abf628da9d92baaa12db89bd6516ee92ec29765f3afafcb8622d697Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1469e89450c361b253aefb0c606b6111Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ff8893e2bfd30fc08455997caf7abb7a6341716768dbbf9a91cc1455bd7eeaf74cdc10ec72a4d4179696040bac620ee97ebc861e2443e5270537ae766d91b58181Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffe5fe93ee4acba095b3b9b6541515ed3eTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffb82c7a4f047561d974de7e38538281d7f005d3663615f30d9663bad35a716063c931672cd452175d55bcdd70bb7aa35a9706872a97963dc52029938ea7341b39Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1333b911fa8ebb16726996adbe3c6262Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ff08bb35f92b06a0832991165a0d9b4fd91af7b7765ce4572aa6222070b11b767092b61b0fd18b3a59cae6deb9db6d4bfb1c7fcfe076cfd66eea7ddd5f877543b9Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffd13712efc45ef87674fb5ac26c37c912Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]

Tff7b72class T56d364TestIdentityTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:

Tff7b72def Td2a8fftest_0_create_from_bytesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3entry Tff7b72in Te6edf3fixed_keysTb4b4b4:
Te6edf3keyTb4b4b4, Te6edf3id_hash Tff7b72= Te6edf3entry
Te6edf3i Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3iTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3id_hashTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3iTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8fftest_1_signTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

T8b949e# Test known signature
Te6edf3fid Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3sig Tff7b72= Te6edf3fidTff7b72.Td2a8ffsignTb4b4b4(Te6edf3signed_messageTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3sigTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3sig_from_key_0Tb4b4b4)Tb4b4b4)

T8b949e# Test signature time jitter
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3id2 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3id2Tff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffbackendTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff"Tb4b4b4:
Te6edf3rounds Tff7b72= T79c0ff2000
Tff7b72elseTb4b4b4:
Te6edf3rounds Tff7b72= T79c0ff20000

Te6edf3times Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3roundsTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff512Tb4b4b4)
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3signature Tff7b72= Te6edf3id1Tff7b72.Td2a8ffsignTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Te6edf3timesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tTb4b4b4)

Tff7b72import T7ee787statistics
Te6edf3tmin Tff7b72= Tffa657minTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmax Tff7b72= Tffa657maxTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmean Tff7b72= Tb4b4b4(Tffa657sumTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72/Tffa657lenTb4b4b4(Te6edf3timesTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmed Tff7b72= Te6edf3statisticsTff7b72.Td2a8ffmedianTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmdev Tff7b72= Te6edf3tmax Tff7b72- Te6edf3tmin
Te6edf3mpct Tff7b72= Tb4b4b4(Te6edf3tmaxTff7b72/Te6edf3tmedTb4b4b4)Tff7b72*T79c0ff100
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRandom messages:Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Signature timing min/avg/med/max/mdev: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tminTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmeanTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmedTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmaxTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmdevTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Max deviation from median: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3mpctTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4)

Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3id2 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3id2Tff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3times Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3roundsTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tff7b72*T79c0ff512
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3signature Tff7b72= Te6edf3id1Tff7b72.Td2a8ffsignTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Te6edf3timesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tTb4b4b4)

Te6edf3tmin Tff7b72= Tffa657minTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmax Tff7b72= Tffa657maxTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmean Tff7b72= Tb4b4b4(Tffa657sumTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72/Tffa657lenTb4b4b4(Te6edf3timesTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmed Tff7b72= Te6edf3statisticsTff7b72.Td2a8ffmedianTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmdev Tff7b72= Te6edf3tmax Tff7b72- Te6edf3tmin
Te6edf3mpct Tff7b72= Tb4b4b4(Te6edf3tmaxTff7b72/Te6edf3tmedTb4b4b4)Tff7b72*T79c0ff100
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffAll 0xff messages:Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Signature timing min/avg/med/max/mdev: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tminTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmeanTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmedTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmaxTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmdevTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Max deviation from median: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3mpctTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4)

Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3id2 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3id2Tff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3times Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3roundsTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[T79c0ff0xffTb4b4b4]Tb4b4b4)Tff7b72*T79c0ff512
Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3signature Tff7b72= Te6edf3id1Tff7b72.Td2a8ffsignTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3t Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start
Te6edf3timesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tTb4b4b4)

Te6edf3tmin Tff7b72= Tffa657minTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmax Tff7b72= Tffa657maxTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmean Tff7b72= Tb4b4b4(Tffa657sumTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72/Tffa657lenTb4b4b4(Te6edf3timesTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmed Tff7b72= Te6edf3statisticsTff7b72.Td2a8ffmedianTb4b4b4(Te6edf3timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3tmdev Tff7b72= Te6edf3tmax Tff7b72- Te6edf3tmin
Te6edf3mpct Tff7b72= Tb4b4b4(Te6edf3tmaxTff7b72/Te6edf3tmedTb4b4b4)Tff7b72*T79c0ff100
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffAll 0x00 messages:Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Signature timing min/avg/med/max/mdev: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tminTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmeanTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmedTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmaxTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3tmdevTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Max deviation from median: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3mpctTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4)

Te6edf3b Tff7b72= T79c0ff0
Te6edf3t Tff7b72= T79c0ff0
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4:
Te6edf3mlen Tff7b72= Te6edf3i Tff7b72% Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTUTff7b72/Tff7b72/T79c0ff2Tb4b4b4) Tff7b72+ Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTUTff7b72/Tff7b72/T79c0ff2Tb4b4b4)
Te6edf3msg Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3mlenTb4b4b4)
Te6edf3b Tff7b72+Tff7b72= Te6edf3mlen
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3id2 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3id2Tff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3signature Tff7b72= Te6edf3id1Tff7b72.Td2a8ffsignTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tff7b72TrueTb4b4b4, Te6edf3id2Tff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4)
Te6edf3t Tff7b72+Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSign/validate chunks < MTU: Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)

Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4:
Te6edf3mlen Tff7b72= T79c0ff16Tff7b72*T79c0ff1024
Te6edf3msg Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3mlenTb4b4b4)
Te6edf3b Tff7b72+Tff7b72= Te6edf3mlen
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3id2 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3id2Tff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3signature Tff7b72= Te6edf3id1Tff7b72.Td2a8ffsignTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tff7b72TrueTb4b4b4, Te6edf3id2Tff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4)
Te6edf3t Tff7b72+Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSign/validate 16KB chunks: Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_2_encryptTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

T8b949e# Test loading identity from bytes
Te6edf3fid Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3fidTff7b72.Td2a8ffhashTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)

T8b949e# Test decryption of known AES-256 token
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting decryption of known tokenTa5d6ff"Tb4b4b4)
Te6edf3plaintext Tff7b72= Te6edf3fidTff7b72.Td2a8ffdecryptTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3fixed_tokenTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3plaintextTb4b4b4, Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3encrypted_messageTb4b4b4)Tb4b4b4)

T8b949e# Test encrypt and decrypt of random chunks
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting random small chunk encrypt/decryptTa5d6ff"Tb4b4b4)
Te6edf3b Tff7b72= T79c0ff0
Te6edf3e_t Tff7b72= T79c0ff0
Te6edf3d_t Tff7b72= T79c0ff0
Te6edf3e_times Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3d_times Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4:
Te6edf3mlen Tff7b72= Te6edf3i Tff7b72% Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTUTff7b72/Tff7b72/T79c0ff2Tb4b4b4) Tff7b72+ Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTUTff7b72/Tff7b72/T79c0ff2Tb4b4b4)
Te6edf3msg Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3mlenTb4b4b4)
Te6edf3b Tff7b72+Tff7b72= Te6edf3mlen
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3id2 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3id2Tff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3e_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3token Tff7b72= Te6edf3id2Tff7b72.Td2a8ffencryptTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3e_now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3e_t Tff7b72+Tff7b72= Te6edf3e_now Tff7b72- Te6edf3e_start
Te6edf3e_timesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3e_now Tff7b72- Te6edf3e_startTb4b4b4)

Te6edf3d_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3decrypted Tff7b72= Te6edf3id1Tff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3tokenTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3msgTb4b4b4, Te6edf3decryptedTb4b4b4)
Te6edf3d_now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3d_t Tff7b72+Tff7b72= Te6edf3d_now Tff7b72- Te6edf3d_start
Te6edf3d_timesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3d_now Tff7b72- Te6edf3d_startTb4b4b4)

Tff7b72import T7ee787statistics
Te6edf3e_tmin Tff7b72= Tffa657minTb4b4b4(Te6edf3e_timesTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4; Te6edf3d_tmin Tff7b72= Tffa657minTb4b4b4(Te6edf3d_timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3e_tmax Tff7b72= Tffa657maxTb4b4b4(Te6edf3e_timesTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4; Te6edf3d_tmax Tff7b72= Tffa657maxTb4b4b4(Te6edf3d_timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3e_tmean Tff7b72= Tb4b4b4(Tffa657sumTb4b4b4(Te6edf3e_timesTb4b4b4)Tff7b72/Tffa657lenTb4b4b4(Te6edf3e_timesTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4; Te6edf3d_tmean Tff7b72= Tb4b4b4(Tffa657sumTb4b4b4(Te6edf3d_timesTb4b4b4)Tff7b72/Tffa657lenTb4b4b4(Te6edf3d_timesTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff1000
Te6edf3e_tmed Tff7b72= Te6edf3statisticsTff7b72.Td2a8ffmedianTb4b4b4(Te6edf3e_timesTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4; Te6edf3d_tmed Tff7b72= Te6edf3statisticsTff7b72.Td2a8ffmedianTb4b4b4(Te6edf3d_timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3e_tmdev Tff7b72= Te6edf3e_tmax Tff7b72- Te6edf3e_tminTb4b4b4; Te6edf3d_tmdev Tff7b72= Te6edf3d_tmax Tff7b72- Te6edf3d_tmin
Te6edf3e_mpct Tff7b72= Tb4b4b4(Te6edf3e_tmaxTff7b72/Te6edf3e_tmedTb4b4b4)Tff7b72*T79c0ff100Tb4b4b4; Te6edf3d_mpct Tff7b72= Tb4b4b4(Te6edf3d_tmaxTff7b72/Te6edf3d_tmedTb4b4b4)Tff7b72*T79c0ff100

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Encrypt chunks < MTU: Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3e_tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Encryption timing min/avg/med/max/mdev: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tminTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tmeanTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tmedTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tmaxTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tmdevTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Max deviation from median: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_mpctTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Decrypt chunks < MTU: Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3d_tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Decryption timing min/avg/med/max/mdev: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tminTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tmeanTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tmedTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tmaxTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tmdevTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Max deviation from median: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_mpctTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4)

T8b949e# Test encrypt and decrypt of large chunks
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTesting large chunk encrypt/decryptTa5d6ff"Tb4b4b4)
Te6edf3mlen Tff7b72= T79c0ff8Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffbackendTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff"Tb4b4b4:
Te6edf3lb Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Te6edf3lb Tff7b72= T79c0ff8
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3lbTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3mlenTb4b4b4)
Te6edf3b Tff7b72+Tff7b72= Te6edf3mlen
Te6edf3id1 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3id2 Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3id2Tff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3id1Tff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3e_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3token Tff7b72= Te6edf3id2Tff7b72.Td2a8ffencryptTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3e_now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3e_t Tff7b72+Tff7b72= Te6edf3e_now Tff7b72- Te6edf3e_start
Te6edf3e_timesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3e_now Tff7b72- Te6edf3e_startTb4b4b4)

Te6edf3d_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3msgTb4b4b4, Te6edf3id1Tff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3tokenTb4b4b4)Tb4b4b4)
Te6edf3d_now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3d_t Tff7b72+Tff7b72= Te6edf3d_now Tff7b72- Te6edf3d_start
Te6edf3d_timesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3d_now Tff7b72- Te6edf3d_startTb4b4b4)

Te6edf3e_tmin Tff7b72= Tffa657minTb4b4b4(Te6edf3e_timesTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4; Te6edf3d_tmin Tff7b72= Tffa657minTb4b4b4(Te6edf3d_timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3e_tmax Tff7b72= Tffa657maxTb4b4b4(Te6edf3e_timesTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4; Te6edf3d_tmax Tff7b72= Tffa657maxTb4b4b4(Te6edf3d_timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3e_tmean Tff7b72= Tb4b4b4(Tffa657sumTb4b4b4(Te6edf3e_timesTb4b4b4)Tff7b72/Tffa657lenTb4b4b4(Te6edf3e_timesTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4; Te6edf3d_tmean Tff7b72= Tb4b4b4(Tffa657sumTb4b4b4(Te6edf3d_timesTb4b4b4)Tff7b72/Tffa657lenTb4b4b4(Te6edf3d_timesTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff1000
Te6edf3e_tmed Tff7b72= Te6edf3statisticsTff7b72.Td2a8ffmedianTb4b4b4(Te6edf3e_timesTb4b4b4)Tff7b72*T79c0ff1000Tb4b4b4; Te6edf3d_tmed Tff7b72= Te6edf3statisticsTff7b72.Td2a8ffmedianTb4b4b4(Te6edf3d_timesTb4b4b4)Tff7b72*T79c0ff1000
Te6edf3e_tmdev Tff7b72= Te6edf3e_tmax Tff7b72- Te6edf3e_tminTb4b4b4; Te6edf3d_tmdev Tff7b72= Te6edf3d_tmax Tff7b72- Te6edf3d_tmin
Te6edf3e_mpct Tff7b72= Tb4b4b4(Te6edf3e_tmaxTff7b72/Te6edf3e_tmedTb4b4b4)Tff7b72*T79c0ff100Tb4b4b4; Te6edf3d_mpct Tff7b72= Tb4b4b4(Te6edf3d_tmaxTff7b72/Te6edf3d_tmedTb4b4b4)Tff7b72*T79c0ff100

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Encrypt Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3mlenTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff chunks: Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3e_tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Encryption timing min/avg/med/max/mdev: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tminTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tmeanTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tmedTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tmaxTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_tmdevTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Max deviation from median: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3e_mpctTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Decrypt Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3mlenTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff chunks: Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsize_strTb4b4b4(Te6edf3bTff7b72/Te6edf3d_tTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Decryption timing min/avg/med/max/mdev: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tminTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tmeanTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tmedTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tmaxTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_tmdevTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Max deviation from median: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3d_mpctTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffsize_strTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3numTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72if Te6edf3suffix Tff7b72== Ta5d6ff'Ta5d6ffbTa5d6ff'Tb4b4b4:
Te6edf3num Tff7b72*Tff7b72= T79c0ff8
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< T79c0ff1000.0Tb4b4b4:
Tff7b72if Te6edf3unit Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.0fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= T79c0ff1000.0

Tff7b72return Ta5d6ff"Tffd700%.2fTffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)

Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff'Ta5d6ff__main__Ta5d6ff'Tb4b4b4:
Te6edf3unittestTff7b72.Td2a8ffmainTb4b4b4(Te6edf3verbosityTff7b72=T79c0ff2Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────